// Let user to pick 2 points on a window to create a Circle entity
//-----------------------------------------------
void DemoWaitPoint1 (HANDLE hLcWnd)
{
double X1, Y1, X2, Y2, Rad;
HANDLE hBlock;
// get a block, linked with CAD window
hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_BLOCK );
for (;;){
lcPropPutInt( hLcWnd, LC_PROP_WND_INT0, 102 );
lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, 1 );
if (lcWndWaitPoint( hLcWnd, L"Center", &X1, &Y1 )){
lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT0, X1 );
lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, Y1 );
lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, 2 );
if (lcWndWaitPoint( hLcWnd, L"Radius", &X2, &Y2 )){
Rad = _hypot( X2-X1, Y2-Y1 );
lcBlockAddCircle( hBlock, X1, Y1, Rad, false );
lcWndRedraw( hLcWnd );
}else{
break; // exit cycle
}
}else{
break; // exit cycle
}
}
}
// Let user to pick 2 points on a window to create a Line entity
//-----------------------------------------------
void DemoWaitPoint2 (HANDLE hLcWnd)
{
double X1, Y1, X2, Y2;
HANDLE hBlock;
// get a block, linked with CAD window
hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_BLOCK );
for (;;){
lcPropPutInt( hLcWnd, LC_PROP_WND_INT0, 101 );
lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, 1 );
if (lcWndWaitPoint( hLcWnd, L"Pick first point", &X1, &Y1 )){
lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT0, X1 );
lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, Y1 );
lcPropPutInt( hLcWnd, LC_PROP_WND_INT1, 2 );
if (lcWndWaitPoint( hLcWnd, L"Pick second point", &X2, &Y2 )){
lcBlockAddLine( hBlock, X1, Y1, X2, Y2 );
lcWndRedraw( hLcWnd );
}else{
break; // exit cycle
}
}else{
break; // exit cycle
}
}
}
//-----------------------------------------------
void CALLBACK EventProc (HANDLE hEvent)
{
int EventType;
HANDLE hLcWnd;
LcApplication* pApp = (LcApplication*)lcPropGetHandle( hEvent, LC_PROP_EVENT_APPPRM2 );
if (pApp){
EventType = lcPropGetInt( hEvent, LC_PROP_EVENT_TYPE );
switch( EventType ){
...
case LC_EVENT_WAITPOINT: pApp->OnWaitPoint( hEvent ); break;
...
}
}
}
//-----------------------------------------------
bool LcApplication::Init (HINSTANCE hInst, LPCWSTR szAppDir)
{
...
lcEventSetProc( LC_EVENT_WAITPOINT, EventProc, 0, (HANDLE)this );
...
bInit = lcInitialize();
...
}
//-----------------------------------------------
void LcApplication::OnWaitPoint (HANDLE hEvent)
{
WCHAR szText[256];
HANDLE hLcWnd, hPtbuf;
double x0, y0, x1, y1, Rad;
int Cmd, Step;
hLcWnd = lcPropGetHandle( hEvent, LC_PROP_EVENT_WND );
Cmd = lcPropGetInt( hLcWnd, LC_PROP_WND_INT0 );
Step = lcPropGetInt( hLcWnd, LC_PROP_WND_INT1 );
if (Cmd == 101){
if (Step == 2){
x0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT0 );
y0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT1 );
x1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURX );
y1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURY );
lcPaint_DrawLine( hLcWnd, x0, y0, x1, y1 );
}
}else
if (Cmd == 102){
x1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURX );
y1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURY );
if (Step == 1){
swprintf( szText, L"Center point %.2f, %.2f", x1, y1 );
lcCmdCursorText( hLcWnd, szText );
}else
if (Step == 2){
x0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT0 );
y0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT1 );
lcPaint_DrawLine( hLcWnd, x0, y0, x1, y1 );
Rad = _hypot( x1-x0, y1-y0 );
hPtbuf = lcPaint_CreatePtbuf();
lcPaint_PtbufAddCircle( hPtbuf, x0, y0, Rad, 128 );
lcPaint_DrawPtbuf( hLcWnd, hPtbuf, true );
lcPaint_DeletePtbuf( hPtbuf );
swprintf( szText, L"Radius %.2f", Rad );
lcCmdCursorText( hLcWnd, szText );
}
}
}